<?php defined('SYSPATH') OR die('No direct access allowed.');
class Minify_Controller extends Controller
{
	public function index()
	{
		$type = $_GET['type'];
		$elements = explode(',', $_GET['files']);
		$cache = false;
		$base = DOCROOT;
		$lastmodified = 0;
		$cachedir = $type=='javascript'?$base.'media/script/cache':$base.'media/css/cache';
		while (list(,$element) = each($elements)) {
			$path = realpath($base . $element);

			if (($type == 'javascript' && substr($path, -3) != '.js') || 
				($type == 'css' && substr($path, -4) != '.css')) {
					header ("HTTP/1.0 403 Forbidden");
					exit;	
				}

			if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
				header ("HTTP/1.0 404 Not Found");
				exit;
			}

			$lastmodified = max($lastmodified, filemtime($path));
		}

		// Send Etag hash
		$hash = $lastmodified . '-' . md5(implode('',$elements));
		header ("Etag: \"" . $hash . "\"");

		if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
			stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') 
		{
			// Return visit and no modifications, so do not send anything
			header ("HTTP/1.0 304 Not Modified");
			header ('Content-Length: 0');
		} 
		else 
		{
			// First time visit or files were modified
			if ($cache) 
			{
				// Determine supported compression method
				$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
				$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');

				// Determine used compression method
				$encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');

				// Check for buggy versions of Internet Explorer
				if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
					preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
						$version = floatval($matches[1]);

						if ($version < 6)
							$encoding = 'none';

						if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) 
							$encoding = 'none';
					}

				// Try the cache first to see if the combined files were already generated
				$cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');

				if (file_exists($cachedir . '/' . $cachefile)) {
					if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {

						if ($encoding != 'none') {
							header ("Content-Encoding: " . $encoding);
						}

						header ("Content-Type: text/" . $type);
						header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));

						fpassthru($fp);
						fclose($fp);
						exit;
					}
				}
			}

			// Get contents of the files
			$contents = '';
			reset($elements);
			while (list(,$element) = each($elements)) {
				$path = realpath($base . $element);
				$contents .= "\n\n" . file_get_contents($path);
			}

			// Send Content-Type
			header ("Content-Type: text/" . $type);

			if (isset($encoding) && $encoding != 'none') 
			{
				// Send compressed contents
				$contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
				header ("Content-Encoding: " . $encoding);
				header ('Content-Length: ' . strlen($contents));
				echo $contents;
			} 
			else 
			{
				// Send regular contents
				header ('Content-Length: ' . strlen($contents));
				echo $contents;
			}

			// Store cache
			if ($cache) {
				if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
					fwrite($fp, $contents);
					fclose($fp);
				}
			}
		}	
		$this->_cache_novalidate();
	}

	/**
	 * 在浏览器端保存缓存，默认一个月
	 */
	private function _cache_novalidate($interval = 2592000)
	{
		$now = time();
		$pretty_lmtime = gmdate('D, d M Y H:i:s', $now) . ' GMT';
		$pretty_extime = gmdate('D, d M Y H:i:s', $now + $interval) . 'GMT';
		// 向后兼容HTTP/1.0
		header("Last Modified: $pretty_lmtime");
		header("Expires: $pretty_extime");
		// 支持HTTP/1.1
		header("Cache-Control: public,max-age=$interval");
	}
	
}
